package loteria.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import loteria.Item;
import loteria.ItemUsuarioNumero;

public class LoteriasDAOImplDB implements LoteriaDAO {

	public static String DB_URL = "jdbc:hsqldb:hsql://localhost/loterias";

	private Connection conn;

	private PreparedStatement saveItem;
	private PreparedStatement findItemByNumer;
	private PreparedStatement findItemByPremio;

	private PreparedStatement addUsuarioNumero;
	private PreparedStatement getItemCantidadbyUsuarios;

	private static LoteriasDAOImplDB dao;

	static LoteriaDAO getDAO() {
		if (dao == null) {
			dao = new LoteriasDAOImplDB();
		}
		return dao;
	}

	private LoteriasDAOImplDB() {
		try {
			Class.forName("org.hsqldb.jdbc.JDBCDriver");
		} catch (ClassNotFoundException e) {
			System.err.println("\nError loading JDBC driver: org.hsqldb.jdbcDriver: "
							+ e.toString());
		}

		try {
			System.out.println("\nConsigo la conexión");

			conn = DriverManager.getConnection(DB_URL, "sa", "");
		} catch (SQLException e) {
			System.err.println("\nError getting DB connection: " + e.toString());
		}

		try {
			Statement st = conn.createStatement();
			String sql = "CREATE TABLE " + TABLE_SORTEO
					+ "(numero int PRIMARY KEY, premio int)";
			st.executeUpdate(sql);

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

		try {
			Statement st = conn.createStatement();
			String sql = "create table " + TABLE_USUARIO + " ("
					+ " usuario varchar(20)," + " numero int, "
					+ " cantidad int,"
					+ " PRIMARY KEY(usuario,numero,cantidad)" + " )";
			st.executeUpdate(sql);

		} catch (SQLException e) {
			// GREETINGS_TABLE already created
			System.out.println(e.getMessage());
		}

		try {
			saveItem = conn.prepareStatement("INSERT INTO " + TABLE_SORTEO
					+ " (numero, premio) VALUES(?, ?)");

			findItemByNumer = conn.prepareStatement("SELECT * FROM "
					+ TABLE_SORTEO + " WHERE numero = ?");
			findItemByPremio = conn.prepareStatement("SELECT * FROM "
					+ TABLE_SORTEO + " WHERE premio = ?");

			addUsuarioNumero = conn.prepareStatement("INSERT INTO "
					+ TABLE_USUARIO
					+ " (usuario, numero, cantidad) VALUES(?, ?,?)");

			getItemCantidadbyUsuarios = conn.prepareStatement("SELECT * FROM "
					+ TABLE_USUARIO + " WHERE usuario = ?");

		} catch (SQLException e) {
			System.err.println("Error preparing DAO statements");
			e.printStackTrace();
		}
	}

	@Override
	public void save(Item item) {
		try {
			saveItem.setInt(1, item.numero);
			saveItem.setInt(2, item.premio);
			saveItem.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public Item getItemByNumero(int numero) {
		try {
			findItemByNumer.setInt(1, numero);
			ResultSet resultados = null;
			resultados = findItemByNumer.executeQuery();
			if (!resultados.next())
				return null;
			else
				return new Item(resultados.getInt(1), resultados.getInt(2));

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;

	}

	@Override
	public Item getItemByPremio(int premio) {
		try {
			findItemByPremio.setInt(1, premio);
			ResultSet resultados = null;
			resultados = findItemByPremio.executeQuery();
			if (!resultados.next())
				return null;
			else
				return new Item(resultados.getInt(1), resultados.getInt(2));

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}


	@Override
	public List<ItemUsuarioNumero> getItemCantidadByUsuario(String usuario) {
		try {

			getItemCantidadbyUsuarios.setString(1, usuario);

			ResultSet resultados = null;
			resultados = getItemCantidadbyUsuarios.executeQuery();
			List<ItemUsuarioNumero> items = new ArrayList<ItemUsuarioNumero>();

			while (resultados.next())
				items.add(new ItemUsuarioNumero(resultados.getString(1), resultados.getInt(2), resultados
						.getInt(3)));

			return items;

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public void reiniciarTablas() {
		try {
			Statement st = this.conn.createStatement();
			String sql = "delete from " + TABLE_SORTEO;
			st.executeUpdate(sql);
			sql = "delete from " + TABLE_USUARIO;
			st.executeUpdate(sql);

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

	}

	@Override
	public void addUsuarioNumero(ItemUsuarioNumero iun) {
		System.out.println("usuario: " + iun.usuario + " numero:" + iun.numero
				+ " cantidad:" + iun.cantidad);
		try {
			addUsuarioNumero.setString(1, iun.usuario);
			addUsuarioNumero.setInt(2, iun.numero);
			addUsuarioNumero.setInt(3, iun.cantidad);
			addUsuarioNumero.execute();
		} catch (SQLException e) {
			System.out.println("Objeto repetido. Se omite");
		}
		
	}

}
